#ifndef __DEV_HT7017_H__
#define __DEV_HT7017_H__

#include <Includes.h>
//#include "DRV_SpiMeter.h"
//#include "DRV_Gps.h"

/*****************************************************************
Multi channels
*****************************************************************/
#define DEV_METER_CHL_CNT 1
#define METER_CHL_CHECK_WITH_RETURN(chl,err) if(chl<1 || chl>DEV_METER_CHL_CNT) {return err;}

typedef struct _meter_info {
    uint16_t u16Energy;  // 1/3200度 //1/12000 度
    uint32_t u32Power;   // 0.1mW
    uint32_t u32Voltage; // 0.1v
    uint32_t u32Current; // mA
    uint32_t u32PowerFactor; // 1/1000
    uint32_t u32LkCurrent; //mA
} meter_info_t;

typedef struct
{
	U32 current; //单位mA
	U32 voltage; //单位V
	U32 power;		//单位0.1mW
	U32 consumption; //单位W.H
	U32 hisConsumption; //单位W.H
	U32 delta; //改变的电量
	U32 factor; //0-1000
    U32 lc; //漏电电流，单位mA
}NORMAL_ELECTRIC_INFO_ST;

/**
数字电压增益： 1
数字电流1增益：1
数字电流2增益：1
模拟电压增益： 2
模拟电流1增益：16
模拟电流2增益：4
EC(电表常数):3200
*/

typedef enum
{
    MAP_HFCONST=0, // 脉冲频率设置寄存器（只读）
    MAP_KU,        // 电压转换系数
    MAP_KI1,       // 电流转换系数
    MAP_KP,        // 功率转换系数（只读）
    MAP_GPHS1,     // PQ方式相位校正
    MAP_GP1,       // 通道1有功功率校正
    MAP_P1OFFSETH, // 第一通道小信号有功功率校正高位
    MAP_P1OFFSETL, // 第一通道小信号有功功率校正低位
    MAP_I1OFFSET,  // 电流通道1有效值偏置校正寄存器
    MAP_GQ1,       // 通道1无功功率校正
    MAP_MODULEEN,  // 模式控制寄存器（只读）
    MAP_KI2,       // 电流转换系数
    MAP_I2OFFSET,  // 电流通道2有效值偏置校正寄存器
    /*************/
    MAP_ID_MAX,
}METER_ADJUST_PARA_EN;

/**
@brief 判断通道号是否有效
@param u32Chl 通道号
@retval 0无效，1有效
*/
int isDevHt7017ChlValid(U32 u32Chl);


/**
@brief 计量模块寄存器参数读取接口
@param u8Chl 通道号(1,2)
@param u32Addr 寄存器地址
@param pu32Value 值指针
@return 0：success，else：fail
*/
uint8_t MeterParaRead(U8 u8Chl,U32 u32Addr,U32* pu32Value);

/**
@brief 计量模块寄存器参数写接口
@param u8Chl 通道号(1,2)
@param u32Addr 寄存器地址
@param u32Value 值
@return 0：success，else：fail
*/
uint8_t MeterParaWrite(U8 u8Chl,U32 u32Addr,U16 u32Value);

/**
@brief 计量模块校准参数读接口
@param u8Chl 通道号(1,2)
@param u32Addr 校准参数
@param pu32Value 值
@return 0：success，else：fail
*/
int MeterAdjustParaRead(U8 u8Chl,METER_ADJUST_PARA_EN enPara,U32 *pu32Value);

/**
@brief 计量模块校准参数写接口
@param u8Chl 通道号(1,2)
@note 执行成功后立即生效
@param u32Addr 校准参数
@param u32Value 值
@return
0：成功
1：资源索引失败
2：写使能关闭
3：计量模块寄存器写入失败
4：NVS存储失败
*/
int MeterAjustParaWrite(U8 u8Chl,METER_ADJUST_PARA_EN enPara,U32 u32Value);

/**
@brief 计量模块校准参数恢复默认值
@param u8Chl 通道号(1,2)
@note 执行成功后立即生效
@return 0：success，else：fail
*/
int MeterAjustParaSetDefault(U8 u8Chl);

/**
@brief 电压校准
@param u8Chl 通道号(1,2)
@param u32Value 标准源电压值 mv
@param u32SmpCnt 采样次数,0：默认值
@return
0：成功
1：资源索引失败
2：写使能关闭
3：计量模块寄存器写入失败
4：NVS存储失败
*/
int KUAdjust(U8 u8Chl,U32 u32Value,U32 u32SmpCnt);

/**
@brief 通道1电流校准
@param u8Chl 通道号(1,2)
@param u32Value 标准源电流值0.01mA
@param u32SmpCnt 采样次数,0：默认值
@return 0：success，else：fail
*/
int KI1Adjust(U8 u8Chl,U32 u32Value,U32 u32SmpCnt);

/**
@brief 主电流校准
@param u8Chl 通道号(1,2)
@param u32Volt 标准源电压值 mv
@param u32Cur 标准源电流值0.01mA
@param u32SmpCnt 采样次数,0：默认值
@return 0：success，else：fail
*/
int KUKI1Adjust(U8 u8Chl,U32 u32Volt,U32 u32Cur,U32 u32SmpCnt);

/**
@brief 通道1有功功率校正和通道1PQ方式相位校正
@param u8Chl 通道号(1,2)
@param u32V1 标准源有功功率Preal(mW)
@param u32V2 标准源无功功率Qreal(mVar)
@param u32SmpCnt 采样次数,0：默认值
@return
0：成功
1：资源索引失败
2：写使能关闭
3：计量模块寄存器写入失败
4：NVS存储失败
*/
int GP1GPHS1Adjust(U8 u8Chl,U32 u32V1,U32 u32V2,U32 u32SmpCnt);

/**
@brief 通道1小信号有功功率矫正
@param u8Chl 通道号(1,2)
@param u32Value 标准源有功功率平均值(mW)
@param u32SmpCnt 采样次数,0：默认值
@return
0：成功
1：资源索引失败
2：写使能关闭
3：计量模块寄存器写入失败
4：NVS存储失败
*/
int P1OffsetAdjust(U8 u8Chl,U32 u32Value,U32 u32SmpCnt);

/**
@brief 通道1电流有效值偏置校正
@param u8Chl 通道号(1,2)
@param u32Value 标准源电流平均值0.01mA
@param u32SmpCnt 采样次数,0：默认值
@return
0：成功
1：资源索引失败
2：写使能关闭
3：计量模块寄存器写入失败
4：NVS存储失败
*/
int I1OffsetAdjust(U8 u8Chl,U32 u32Value,U32 u32SmpCnt);

/**
@brief 副电流校准
@param u8Chl 通道号(1,2)
@param u32Value 标准源电流值0.01mA
@param u32SmpCnt 采样次数,0：默认值
@return 0：success，else：fail
*/
int KI2Adjust(U8 u8Chl,U32 u32Value,U32 u32SmpCnt);

/**
@brief 副电流有效值偏置校正
@param u8Chl 通道号(1,2)
@param u32Value 标准源电流平均值0.01mA
@param u32SmpCnt 采样次数,0：默认值
@return
0：成功
1：资源索引失败
2：写使能关闭
3：计量模块寄存器写入失败
4：NVS存储失败
*/
int I2OffsetAdjust(U8 u8Chl,U32 u32Value,U32 u32SmpCnt);



/************************************************************
调试接口
************************************************************/
typedef struct
{
    U32 u32InitCur;       // 最近初始化状态
    U32 u32InitSuccCnt;   // 初始化成功次数
    U32 u32InitTotalCnt;  // 初始化总次数
    U32 u32MrcSuccCnt;    // 寄存器校正成功次数
    U32 u32MrcRFailCnt;   // 寄存器校正读寄存器失败次数
    U32 u32MrcWFailCnt;   // 寄存器校正写寄存器失败次数
    U32 u32MrcE11Cnt;     // 寄存器校正失败原因11次数
    U32 u32MrcE12Cnt;     // 寄存器校正失败原因12次数
    U32 u32MrcE13Cnt;     // 寄存器校正失败原因13次数
    U32 u32MrcE14Cnt;     // 寄存器校正失败原因14次数
    U32 u32MrcE15Cnt;     // 寄存器校正失败原因15次数
    U32 u32MrcE16Cnt;     // 寄存器校正失败原因16次数
    U32 u32MrcE17Cnt;     // 寄存器校正失败原因17次数
    U32 u32MrcE18Cnt;     // 寄存器校正失败原因18次数
}SDevHt7017StatusSts;

/**
@brief 计量设备统计信息获取接口
@param pst 消息接收结构体
@param pu32ChgFlag 和上次读取的值是否变化,0:没变化，1：变化了
@retval 0:成功
*/
U32 MeterDevStatusStsGet(SDevHt7017StatusSts *pst,U32 *pu32ChgFlag);

/**
    计量模块寄存器巡查纠正
*/
void ErcRegCheckLoop(void);
uint8_t MeterInit(void);
uint8_t MeterInfoGet(U8 u8Chl,meter_info_t *info);
int NormalElecInfoGet(U8 u8Chl,NORMAL_ELECTRIC_INFO_ST *pstElecInfo);

#endif

